import CryptoJS from 'crypto-js'


const secretKey1 = 'WC1HLURBVE';
const secretKey2 = 'EtTUFTSw====';

export function toBase64(key) {
  return Buffer.from(key, 'base64').toString('utf8');
}

export function getMaskHeaderKey() {
  return toBase64(secretKey1.concat(secretKey2));
}


export function getSecretKey(hexStr) {
  const SECRET_POOL_STR = 'ImGvtLt372I9971ScUZIL84dlniXcWPE';
  let secretStr = '';
  let binaryStr = '';

  for (let i = 0; i < 8; i++) {
    let tmpHex = hexStr.substring(i, i + 1);
    let tmpStr = parseInt(tmpHex, 16).toString(2).padStart(4,'0');
    for (let j = 0; j < 4; j++) {
      if (tmpStr[j] == '1') {
        secretStr = secretStr.concat(SECRET_POOL_STR[i * 4 + j]);
      }
    }
  }
  return secretStr;
}


/**
 * 生成一个新的密钥。
 *
 * 此函数根据给定的时间戳生成一个32字节长的密钥。密钥的生成过程首先将时间戳转换为Base64字符串，
 * 然后通过与一个预设的密钥池字符串相结合，循环使用Base64字符串中的字符，确保生成的密钥长度为32字节（256位）。
 *
 * @param {number} timestamp - 用于生成密钥的时间戳。
 * @returns {string} - 生成的32字节长的密钥字符串。
 */
export function getSecretKeyNew(timestamp) {
  const SECRET_POOL_STR = 'ImGvtLt372I9971ScUZIL84dlniXcWPE';
  let secretKey = '';

  // 将时间戳转换为 Base64 字符串
  const timestampBase64 = toBase64(timestamp.toString());

  // 确保生成的密钥长度为 32 字节（256 位）
  for (let i = 0; i < 32; i++) {
    const index = i % timestampBase64.length; // 循环使用 Base64 字符串中的字符
    secretKey += SECRET_POOL_STR.charAt((timestampBase64.charCodeAt(index) + i) % SECRET_POOL_STR.length);
  }

  return secretKey;
}


/**
 * AES加密
 * @param plainText 明文
 * @param keyInBase64Str base64编码后的key
 * @param ivInBase64Str base64编码后的初始化向量(只有CBC模式下才支持)
 * @return base64编码后的密文
 */
export function encryptByAES(plainText, keyInBase64Str, ivInBase64Str) {
  let key = CryptoJS.enc.Base64.parse(keyInBase64Str)
  let iv = CryptoJS.enc.Base64.parse(ivInBase64Str)
  let encrypted = CryptoJS.AES.encrypt(plainText, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  })
  // 这里的encrypted不是字符串，而是一个CipherParams对象
  return encrypted.ciphertext.toString(CryptoJS.enc.Base64)
}

/**
 * AES解密
 * @param cipherText 密文
 * @param keyInBase64Str base64编码后的key
 * @param ivInBase64Str base64编码后的初始化向量(只有CBC模式下才支持)
 * @return 明文
 */
export function decryptByAES(cipherText, keyInBase64Str, ivInBase64Str) {
  let key = CryptoJS.enc.Base64.parse(keyInBase64Str)
  let iv = CryptoJS.enc.Base64.parse(ivInBase64Str)
  // 返回的是一个Word Array Object，其实就是Java里的字节数组
  let decrypted = CryptoJS.AES.decrypt(cipherText, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  })

  return decrypted.toString(CryptoJS.enc.Utf8)
}
